
\chapter{图像识别应用程序}{}
上文着重阐述的是一个底层的、通用的网络服务器程序如何设计与实现。本节内容主要是作为上文阐述的底层模块的上层业务，完成一个拍照识别植物的应用。

\section{ResNet网络的使用}{}
在利用深度神经网络做图像识别时，直观上人们猜测：增加网络深度后，网络可以进行更加复杂的特征提取，因此更深的模型可以取得更好的结果。

但事实并非如此，研究人员发现随着网络深度的增加，模型精度并不总是提升，并且这个问题显然不是由过拟合（overfitting）造成的，因为网络加深后不仅测试误差变高了，它的训练误差竟然也变高了。原文作者提出，这可能是因为更深的网络会伴随梯度消失/爆炸问题，从而阻碍网络的收敛。原文作者将这种加深网络深度但网络性能却下降的现象称为退化问题（degradation problem）\textsuperscript{\cite{resnet}}。

ResNet的提出改变了这一现状，作者通过构建恒等映射的方式，使得更深的网络得出的训练结果总是优于较浅的——较浅的网络的解空间是较深的解空间的子集，可以将多余的层数变换为衡等映射的方式使得更深的网络至少能产生不高于较浅的网络的训练误差。图\ref{fig:basicblock}是残差学习的基本单元\textsuperscript{\cite{resnet}}。
\begin{figure}[h]
  \centering
  \includegraphics[scale=0.1]{figures/basicblock.png}
  \caption{Resnet中残差学习的基本单元}
  \label{fig:basicblock}
\end{figure}

我们使用ResNet残差网络完成了植物识别模型的训练，并将单张图片的识别任务作为了本文提出的通用的服务端框架的一个上层业务。

同时，在做物体识别时，我们不仅可以基于它们的特征，还能基于它们的真实大小来做识别。后续的一些改良的神经网络如SizeNet\textsuperscript{\cite{sizenet}}就是基于这样一点来高效地完成物体识别的。SizeNet能够正确识别特征高度相似但实际尺寸明显不同的目标，以及正确区分实际尺寸与目标尺寸明显不同的干扰目标。再细分到进行植物识别时，由于植物本身具有高度的变异性，分类则更容易混淆，一些学者提出了一种基于植物器官检测的自底向上方法，并融合了多个基于器官的物种分类器的预测\textsuperscript{\cite{plant_classification}}，还能根据植物叶片的图像做出亮度校正、中值滤波和阈值分割等预处理，计算植物叶片的偏心率、圆形性、圆形度指标、方向角等植物特有信息做提取，定制植物识别的神经网络\textsuperscript{\cite{leaf_classification}}。


\section{安卓客户端应用}{}
    \subsection{工程架构}{}
    安卓端植物识别应用的总体工程架构如图\ref{fig:androidarch}所示。
\begin{figure}[h]
  \centering
  \includegraphics[scale=0.4]{figures/android-arch.pdf}
  \caption{安卓端植物识别应用的总体工程架构}
  \label{fig:androidarch}
\end{figure}

\begin{figure}[h!]
    \centering
    \subfloat[应用程序的主页]{
    \includegraphics[width=4.44cm]{figures/index.jpg}
    \label{fig:index}}
    \subfloat[查询图像类别页]{
    \includegraphics[width=4.44cm]{figures/query.jpg}
    \label{fig:query}}
    \subfloat[搜索历史页]{
    \includegraphics[width=4.44cm]{figures/mine.jpg}
    \label{fig:mine}}
    \caption{安卓应用程序主要界面}
    \label{fig:UI}
\end{figure}

    \subsection{主要UI展示}{}
    图\ref{fig:UI}展示了植物图像识别安卓端应用程序的三个主要的用户界面。

    \subsection{存储}{}
    安卓端植物识别应用的存储模块使用安卓提供的数据库SQLiteDatabase，本地存储包含了用户所有的查询条目历史信息、用户账户信息等。

    \subsection{网络}{}
    由于在后台网络通信模块的实现中积累了对Linux系统网络通信模块的系统调用的使用经验，因此安卓端植物识别应用的网络模块复用了部分后台中的逻辑。最终编译打包为C++动态链接库，在安卓端使用中Jni技术链接且调用到网络库。

